package com.recorder.myapplication

import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Button
import android.widget.TextView
import com.recorder.myapplication.service.ForegroundService
import com.recorder.myapplication.service.StickyService

class MainActivity : AppCompatActivity() {

    /**
     * 1.进程的一些常识
     *  app为什么会被系统杀死: 内存不足
     *  进程的优先级 : 前台进程 可见进程 服务进程 后台进程 空进程
     * # cat  /proc/2233/oom_adj 查看进程优先级
     *  系统如何决定杀死哪个进程的
     */
    /**
     * 2.如何保活
     * activity1像素保活 : 缺点:应用退出后台后,不息屏不会启动保活,只有在息屏的时候才会启动1像素保活
     * 前台服务保活  /./启动一个前台服务,从而拉高整个应用的优先级
     *   缺点: 当api>26的时候暂时没有方式隐藏通知
     *   需要适配: api<18 的时候不会显示通知
     *            api<-18 可以启动双服务,,绑定同一个id,然后stop第二个服务,通知栏图标不会显示
     *
     */

    /**
     * 3.如何拉活
     * 广播拉活 1. 系统广播 : 7.0之后做了限制 在8.0之后更是不能用了
     *         2. 应用全家桶广播: 例如 qq ,qq空间之类的腾讯系的App之间会拉活, 可以反编译看看他们发出的是什么广播,然后自己的App注册监听这个广播
     * sticky拉活 :
     *   START_STICKY : 粘性=> 如果service进程被KILL掉,保留service的状态为开启状态,
     *                  但不会保留传送的intent对象.随后系统会尝试重新创建service,由于服务状态为开启状态,
     *                  所以创建服务后一定会调用onStartCommand(Intent,int,int)方法.
     *                  如果在此期间没有任何启动命令传送到service,那么参数Intent将为null;
     *   START_NOT_STICKY  : 非粘性 =>使用这个返回值时,如果执行完onStartCommand后,服务异常kill掉,系统不会自动重启该服务;
     *   START_REDELIVER_INTENT : 重传Intent. 使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入;
     *   START_STICKY_COMPATIBILITY :START_STICKY的兼容版本,但不保证服务被kill掉一定会重启
     *
     *   只要targetSDKVersion不小于5,就默认是START_STICKY ;
     *    但是某些ROM系统不会拉活;并且经过测试,service第一次被异常kill后很快会重启,第二次会比第一次慢,第三次会比第二次慢.一旦短时间内被杀死4-5次,则系统不再拉起;
     * 账户拉活  :
     * JobScheduler拉活:
     * 双进程守护:
     */


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        /**
         *         activity保活
         */
        //     KeepManager.getmInstance().registerKeep(this)

        val mButton = findViewById<Button>(R.id.mButton)
        val mTextView = findViewById<TextView>(R.id.mTextView)
        mButton.setOnClickListener {

            val random = Math.random()
            mTextView.text = "测试改变文字:$random"

        }

        /**
         * 前台服务保活
         */
        // startService(Intent(this, ForegroundService::class.java));

        /**
         * sticky拉活
         */

        startService(Intent(this, StickyService::class.java))


    }

    override fun onDestroy() {
        super.onDestroy()


        // KeepManager.getmInstance().unRegisterKeep(this)
    }
}
